package at.intelligentminds.service; import java.util.ArrayList; import java.util.List; import java.util.Set; import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import org.hibernate.Criteria; import org.hibernate.Transaction; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Disjunction; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.hibernate.transform.Transformers; import org.json.JSONArray; import org.json.JSONObject; import at.intelligentminds.service.model.HibernateSupport; import at.intelligentminds.service.model.User; @Path("/userservice") public class UserService { @POST @Path("/searchaccount") @Produces(MediaType.TEXT_PLAIN) public String searchAccount(@FormParam("searchText") String searchText, @FormParam("authtoken") String authtoken) { if(!new LoginService().validate(authtoken)) return "[]"; User currentUser = LoginService.getUserByToken(authtoken); if(currentUser == null) { return "[]"; } String[] parts = searchText.split(" "); Transaction tx = HibernateSupport.getSession().beginTransaction(); Criterion cemail = Restrictions.like("email", "%" + searchText + "%"); Criterion cfirstname = Restrictions.like("firstName", "%" + searchText + "%"); Criterion clastname = Restrictions.like("lastName", "%" + searchText + "%"); Criterion caccountname = Restrictions.like("accountName", "%" + searchText + "%"); Criterion notCurrentUser = Restrictions.ne("email", currentUser.getEmail()); Disjunction or = Restrictions.disjunction(); or.add(cemail); or.add(cfirstname); or.add(clastname); or.add(caccountname); if (parts.length > 1) { for (int i = 0; i < parts.length; i++) { cemail = Restrictions.like("email", "%" + parts[i] + "%"); cfirstname = Restrictions.like("firstName", "%" + parts[i] + "%"); clastname = Restrictions.like("lastName", "%" + parts[i] + "%"); caccountname = Restrictions.like("accountName", "%" + parts[i] + "%"); or.add(cemail); or.add(cfirstname); or.add(clastname); or.add(caccountname); } } Criterion andCombined = Restrictions.and(or, notCurrentUser); Criteria criteria = HibernateSupport.getSession().createCriteria(User.class); criteria.add(andCombined); criteria.setProjection( Projections.projectionList().add(Projections.property("firstName"), "firstName") .add(Projections.property("lastName"), "lastName") .add(Projections.property("accountName"), "accountName") .add(Projections.property("email"), "email")).setResultTransformer(Transformers.aliasToBean(User.class)); List res = criteria.list(); JSONArray array = new JSONArray(res.toArray()); tx.commit(); return array.toString(); } @POST @Path("/addcontact") @Produces(MediaType.TEXT_PLAIN) public Boolean addContact(@FormParam("contactEmail") String contactEmail, @FormParam("userEmail") String userEmail, @FormParam("authtoken") String authtoken) { if (!new LoginService().validate(authtoken)) { return false; } Transaction tx = HibernateSupport.getSession().getTransaction(); tx.begin(); User user = (User) HibernateSupport.getSession().get(User.class, userEmail); User contact = (User) HibernateSupport.getSession().get(User.class, contactEmail); if (user == null || contact == null || user.getUsersForContactId().contains(contact)) { tx.commit(); return false; } user.getUsersForContactId().add(contact); contact.getUsersForContactId().add(user); List<Object> entities = new ArrayList<Object>(); entities.add(user); entities.add(contact); try { Boolean result = HibernateSupport.persistMultiple(entities); tx.commit(); return result; } catch(Exception e) { e.printStackTrace(); if(tx != null) { tx.rollback(); } return false; } } @POST @Path("/retrievecontacts") @Produces(MediaType.TEXT_PLAIN) public String retrieveContacts(@FormParam("userEmail") String userEmail, @FormParam("authtoken") String authtoken) { try{ if (!new LoginService().validate(authtoken)) { return "[]"; } Transaction tx = HibernateSupport.getSession().getTransaction(); tx.begin(); User user = (User) HibernateSupport.getSession().get(User.class, userEmail); if (user == null) { tx.commit(); return "[]"; } Set<User> contacts = user.getUsersForContactId(); ArrayList<User> newContacts = new ArrayList<User>(); JSONArray array = new JSONArray(); try { for(User contact : contacts) { User newContact = new User(contact.getEmail(), contact.getAccountName(), contact.getFirstName(), contact.getLastName()); newContacts.add(newContact); } array = new JSONArray(newContacts.toArray()); tx.commit(); } catch(Exception e) { e.printStackTrace(); if(!tx.wasCommitted()) { tx.rollback(); } } return array.toString(); } catch (Exception e){ e.printStackTrace(); } return "[]"; } @Path("/updateuser") @POST @Produces(MediaType.TEXT_PLAIN) public Boolean updateUser(@FormParam("userEmail") String email, @FormParam("authtoken") String authtoken, @FormParam("firstName") String firstName, @FormParam("lastName") String lastName, @FormParam("profileText") String profileText) { if (!new LoginService().validate(authtoken)) { return false; } Transaction tx = HibernateSupport.getSession().beginTransaction(); try { User user = (User) HibernateSupport.getSession().get(User.class, email); if(firstName != null) { user.setFirstName(firstName); } if(lastName != null) { user.setLastName(lastName); } if(profileText != null) { user.setProfileText(profileText); } HibernateSupport.persist(user); tx.commit(); } catch (Exception e) { e.printStackTrace(); if(tx != null) { tx.rollback(); } return false; } return true; } @POST @Path("/userinformation") @Produces(MediaType.TEXT_PLAIN) public String getUserInformation(@FormParam("contactEmail") String contactEmail, @FormParam("authtoken") String authtoken) { if (!new LoginService().validate(authtoken)) { return ""; } Transaction tx = HibernateSupport.getSession().getTransaction(); tx.begin(); User user = (User) HibernateSupport.getSession().get(User.class, contactEmail); tx.commit(); if (user == null) { return ""; } User retrievedUser = new User(); retrievedUser.setAccountName(user.getAccountName() == null ? "" : user.getAccountName()); retrievedUser.setEmail(user.getEmail()); retrievedUser.setFirstName(user.getFirstName()); retrievedUser.setLastName(user.getLastName()); retrievedUser.setProfileText(user.getProfileText() == null ? "" : user.getProfileText()); retrievedUser.setGender(user.getGender() == null ? "" : user.getGender()); JSONObject userObject = new JSONObject(retrievedUser); return userObject.toString(); } @Path("/logout") @POST @Produces(MediaType.TEXT_PLAIN) public Boolean logout(@FormParam("email") String userEmail, @FormParam("authtoken") String authtoken) { if (!new LoginService().validate(authtoken)) { return false; } LoginService.removeUserByToken(authtoken); return true; } @Path("/searchaccount") @GET @Produces(MediaType.TEXT_HTML) public String get() { return "These are not the droids you are looking for."; } }